package com.stellar.circle.handler;

import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;

import com.stellar.pay.core.service.IPaymentNotifyHandler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.text.ParseException;
import java.util.concurrent.TimeUnit;

/**
 * 支付业务处理器
 */
@Service
@Slf4j
public class OrderPaymentHandler implements IPaymentNotifyHandler {


    // 定义缓存（订单号 + 过期时间）
    private static final Cache<String, Boolean> orderCache = CacheBuilder.newBuilder()
            .expireAfterWrite(24, TimeUnit.HOURS) // 订单号缓存24小时
            .maximumSize(10000) // 最大缓存数量
            .build();

    /**
     * 处理支付成功
     *
     * @param orderNo       商户订单号
     * @param transactionId 微信支付订单号
     * @param amount        支付金额（单位：分）
     * @param successTime   支付成功时间
     * @param tradeType     支付类型
     * @param object        回调对象
     */
    @Override
    public void handlePaymentSuccess(String orderNo, String transactionId, BigDecimal amount, String successTime, String tradeType, Object object) throws ParseException {
        // 检查缓存
        if (orderCache.getIfPresent(orderNo) != null) {
            return;
        }

        // 加锁，防止并发处理
        synchronized (orderNo.intern()) {
            if (orderCache.getIfPresent(orderNo) != null) {
                return;
            }

            try {
                // 处理支付逻辑
                // TODO 记录支付记录操作

                // 标记缓存
                orderCache.put(orderNo, true);
            } catch (Exception e) {
                orderCache.invalidate(orderNo); // 清除缓存以便重试
                throw e;
            }
        }
    }

    /**
     * 处理支付失败
     *
     * @param orderNo  商户订单号
     * @param errorMsg 错误信息
     */
    @Override
    public void handlePaymentFailure(String orderNo, String errorMsg) {
        try {

        } catch (Exception e) {
            log.error("OrderPaymentHandler.handlePaymentFailure.error.支付失败:{}", e.getMessage(), e);
        }
    }

    @Override
    public boolean checkOrder(String orderNo) {
        return false;
    }


}